Skip to main content

Example: Displaying a Deck GL Layer with Barikoi React GL

The GeoJsonLayer in this example demonstrates how to integrate Deck GL with the react-bkoi-gl package, providing a powerful way to visualize geographic data on a map. The GeoJsonLayer is designed to render GeoJSON data on top of a Barikoi map using the MapboxOverlay from Deck GL, allowing for highly customizable map layers.

By leveraging react-bkoi-gl alongside Deck GL, this example highlights the capability to create rich, layered maps with custom geo-referenced data, enhancing mapping and geospatial applications for diverse use cases such as urban planning, transportation, and location analysis.

Example

import { useEffect, useRef, useState } from "react";
import { GeoJsonLayer } from "@deck.gl/layers"; // Import DeckGL Layer
import { MapboxOverlay } from "@deck.gl/mapbox"; // Import Mapbox Overlay
import { Map, useControl } from "react-bkoi-gl"; // Import the Barikoi React GL package
import "react-bkoi-gl/styles"; // Import CSS for proper map styling

// Create DeckGL Overlay
const DeckGLOverlay = (props) => {
const overlay = useControl(() => new MapboxOverlay(props));
overlay.setProps(props);
return null;
};

const App = () => {
const BARIKOI_API_KEY = "YOUR_BARIKOI_API_KEY_HERE";
const mapStyle = `https://map.barikoi.com/styles/osm-liberty/style.json?key=${BARIKOI_API_KEY}`;
const mapContainer = useRef(null);
const mapRef = useRef(null);
const [data, setData] = useState(null);

const initialViewState = {
longitude: 90.36402,
latitude: 23.823731,
minZoom: 4,
maxZoom: 30,
zoom: 6,
bearing: 0,
pitch: 0,
antialias: true,
};

useEffect(() => {
// Fetching GeoJSON data
fetch("/data.json")
.then((response) => response.json())
.then((jsonData) => setData(jsonData))
.catch((error) => console.error("Error loading GeoJSON data:", error));
}, []);

const layers = new GeoJsonLayer({
id: "GeoJsonLayer",
data,
stroked: false,
filled: true,
pointType: "circle+text",
pickable: true,
lineWidthScale: 3,
lineWidthMaxPixels: 5,
lineWidthMinPixels: 1,
getFillColor: [160, 160, 180, 200],
wireframe: true,
});

return (
<div ref={mapContainer} style={containerStyles}>
<Map
ref={mapRef}
mapStyle={mapStyle}
style={{ width: "100%", height: "100%" }}
initialViewState={initialViewState}
doubleClickZoom={false}
dragRotate={false}
attributionControl={false}
>
<DeckGLOverlay layers={[layers]} />
</Map>
</div>
);
};

// JSX Styles
const containerStyles = {
width: "100%",
height: "100vh",
minHeight: "400px",
overflow: "hidden",
};

export default App;